package test.rocksdb;

import org.rocksdb.BlockBasedTableConfig;
import org.rocksdb.BloomFilter;
import org.rocksdb.Filter;
import org.rocksdb.HashLinkedListMemTableConfig;
import org.rocksdb.HashSkipListMemTableConfig;
import org.rocksdb.Options;
import org.rocksdb.RateLimiter;
import org.rocksdb.ReadOptions;
import org.rocksdb.RocksDB;
import org.rocksdb.SkipListMemTableConfig;
import org.rocksdb.Statistics;
import org.rocksdb.VectorMemTableConfig;
import org.rocksdb.WriteOptions;
import org.rocksdb.util.SizeUnit;

public class RocksdbConfig {

	public void do载入配置() {

	}
	
	public static final int I模式_单机 = 1;
	public static final int I模式_主从 = 2;
	public static final int I模式_集群 = 3;

	public static String[] s其他主机;
	public static String s本机;
	public static String s存储路径;

	// 实例化
	public static RocksdbConfig getInstance() {
		return null;
//		import hyl.base.net.bio.BIOSocketSrv;
//		BIOSocketSrv bioc = new BIOSocketSrv(9090);
	}

	public void do初始化Rocksdb() {
		RocksDB.loadLibrary();
		getConfig();

	}

	final Options options = new Options();
	// 用于分析数据库性能的统计信息。由选项类管理的统计对象的指针
	final Statistics stats = new Statistics();
	/*
	 * 速率限制器，用于控制刷新和压缩的写入速率。 rateBytesPerSecond 它控制压缩和刷新的总写入速率（字节/秒）
	 * refillPeriodMicros 这控制令牌的重新填充频率。 设置为100ms时，则在内部每100ms重新填充1MB 100000毫秒的默认值应该有效
	 * fairness 速率限制器接受高优先级请求和低优先级请求。低优先级请求通常被阻塞以支持高优先级请求。你如果将其保留为默认值10，应该会很好
	 */
	final RateLimiter rateLimiter = new RateLimiter(10000000, 10000, 10);

	public void getConfig() {
		// final Options options = new Options();
		// 参考https://rocksdb.org.cn/doc/Setup-Options-and-Basic-Tuning.html
		try {
			// 默认值：false, true 创建指定数据库的标志开放式
			//
			options.setCreateIfMissing(true)
			// 设置收集有关数据库的度量的统计对象操作.统计不应在数据库实例之间共享对象，因为它不使用任何锁来防止并发更新。
			// .setStatistics(stats)
			// 它代表了用来存储写入磁盘前，没有排序过的内存数据的大小，默认值为64M。
			// 如果你的内存不足，你应该减小这个值。否则，不推荐修改这个值。
			// .setWriteBufferSize(8 * SizeUnit.KB)
			// 这是一个数据库里面所有跨列族写缓冲区内存的最大值,这个功能默认是关闭的（设置为0）。一般不应该修改他。
			// 但是，为了举个例子，你确实需要设置他为64G的时候，可以这样做 64 << 3
			// .setDbWriteBufferSize(dbWriteBufferSize)
			// 最大写缓存数量
			// .setMaxWriteBufferNumber(3)
			// 指定提交给默认低优先级线程的最大并发后台压缩作业数游泳池。如果您正在增加这个值，还可以考虑增加低优先级线程池中的线程数。请参见默认值：1
			// .setMaxBackgroundCompactions(10)
			// 使用指定的压缩算法压缩块。此参数可以更改动态。默认：快速压缩，提供轻量级但快速的压缩。
			// .setCompressionType(CompressionType.SNAPPY_COMPRESSION)
			// 设置压缩样式默认数据库：水平。
			// .setCompactionStyle(CompactionStyle.UNIVERSAL);
			// 设置内存映射模式
			// .setMemTableConfig( getHashSkipListMemTableConfig() )
			// 设置内存表格式
			// .setTableFormatConfig(new PlainTableConfig())
			// .setTableFormatConfig(getBasedTableConfig());
			// 文件读取sst表。默认值：false
			// .setAllowMmapReads(true)
			// 用于控制刷新和压缩的写入速率。冲洗比压实具有更高的优先级。如果为null 速率限制禁用.默认值：空
			// .setRateLimiter(rateLimiter)
			;

		} catch (final IllegalArgumentException e) {
			assert (false);
		}
	}

	public HashSkipListMemTableConfig getHashSkipListMemTableConfig() {
		return new HashSkipListMemTableConfig().setHeight(4).setBranchingFactor(4).setBucketCount(2000000);

	}

	public SkipListMemTableConfig getSkipListMemTableConfig() {
		return new SkipListMemTableConfig();
	}

	public HashLinkedListMemTableConfig getHashLinkedListMemTableConfig() {
		return new HashLinkedListMemTableConfig().setBucketCount(100000);
	}

	public VectorMemTableConfig getVectorMemTableConfig() {
		return new VectorMemTableConfig().setReservedSize(10000);
	}

	// 过滤器
	final Filter bloomFilter = new BloomFilter(10);

	public BlockBasedTableConfig getBasedTableConfig() {
		final BlockBasedTableConfig table_options = new BlockBasedTableConfig();
		table_options
				// 读写缓存大小
				.setBlockCacheSize(64 * SizeUnit.KB)
				// 使用指定的筛选策略减少磁盘读取,如果过滤器.处理（）函数未被调用,筛选器对象自动被gc
				.setFilter(bloomFilter)
		// 控制块的碎片数缓存。这个仅当cacheSize设置为非负时才应用。
		// .setCacheNumShardBits(6)
		/*
		 * blockSizeDeviation允许的块尺寸偏差 , 如果当前块中的可用空间百分比小于此指定数字，并且向块中添加新记录将超过配置的块大小，
		 * 则此块将关闭，新记录将写入下一个块。默认值是10。
		 */
		// .setBlockSizeDeviation(5)
		// 设置块重新启动间隔
		// .setBlockRestartInterval(10)
		// 指示是否将索引/筛选器块放入该块缓存。如果未指定，每个“表读取器”对象将在表初始化期间预加载索引/筛选器块。
		// .setCacheIndexAndFilterBlocks(true)
		// 如果true，则不存储前缀并允许前缀哈希冲突（较少内存消耗）
		// .setHashIndexAllowCollision(false)
		// 压缩块缓存的大小
		// .setBlockCacheCompressedSize(64 * SizeUnit.KB)
		// 控制压缩块的碎片数缓存。这个仅当blockCompressedCacheSize设置为非负时才应用。
		// .setBlockCacheCompressedNumShardBits(10)
		;
		return table_options;
	}

	
}
